package com.itheima.filter;

import com.itheima.bean.Employee;
import com.itheima.bean.User;
import com.itheima.utils.BaseContext;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    1. 这是一个登录校验的过滤器，所有的请求来访问，都需要经过该过滤器的校验
    2. 如何校验呢？
        2.1 当前请求到来的时候，要获取请求的地址路径
             req.getRequestURL();    localhost:8080/backend/index.html
             req.getRequestURI();    /backend/index.html
        2.2 判定该请求是否属于直接放行的请求
            2.2.1 如果是，那么就直接放行
                login.html  login
            2.2.2 如果不是，就要校验有没有登录 【怎么知道有没有登录呢？】
                2.2.2.1 判定session里面是否保存着 Employee对象
                    a. 如果保存了，即表示已经登录了，那直接放行
                    b. 如果没有保存，即表示没有登录，就让它去登录【跳转登录页面】
     3. 具体步骤：
        3.1 定义类，实现接口Filter
        3.2 注册过滤器， @WebFilter("/*")
        3.3 注意： 过滤器要想在springmvc的环境下生效，需要登记在启动类上打注解 @ServletComponent
 */
@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //0. 转化对象
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;


        //1. 获取请求地址   /backend/index.html
        String uri = req.getRequestURI();

        System.out.println("被抓住的请求是：" + uri);


        //2. 判定是否属于直接放行的请求
        if(uri.contains("login") || uri.endsWith(".css") || uri.endsWith(".js")
            || uri.contains("images") || uri.contains("plugin") || uri.contains("style")
            || uri.endsWith(".ico") || uri.contains("sms")){
            filterChain.doFilter(servletRequest, servletResponse);
            return ;
        }

        //3. 如果没有进入上面的if， 即表示要判定登录
        //3.1 从session作用域里面获取登录的时候，保存的员工对象
        Employee employee = (Employee) req.getSession().getAttribute("employee");

        //3.2 判定是否有值
        if(employee != null){ //表示已经登录了

            //在这里保存员工的id到ThreadLocal里面去
            BaseContext.setCurrentId(employee.getId());


            filterChain.doFilter(servletRequest, servletResponse);
            return ;
        }


        //4. 判断用户是否有登录，如果已经登录了，就直接放行！
        User user = (User) req.getSession().getAttribute("user");
        //4.1 判断用户是否已经登录了
        if(user!=null){

            //4.2 存储该用户的id到threadlocal。
            BaseContext.setCurrentId(user.getId());

            //4.3. 直接放行！
            filterChain.doFilter(servletRequest, servletResponse);

            return ;
        }



        //5. 如果没有进入上面的if，即表示该请求，不属于直接放行的请求，也没有登录。要跳转登录页面
        if(uri.contains("front")){
            resp.sendRedirect("/front/page/login.html");
        }else{
            resp.sendRedirect("/backend/page/login/login.html");
        }
    }
}
